/**
 * 模块别名配置文件
 *
 * 此文件定义了在 Vitest 和 Rollup 之间共享的模块路径别名映射。
 * 这些别名用于在构建和测试过程中简化模块导入路径，使代码更易于管理和维护。
 *
 * @ts-check
 */
import { readdirSync, statSync } from 'node:fs'
import path from 'node:path'
import { fileURLToPath } from 'node:url'

/**
 * 为指定的包名解析入口文件路径
 *
 * @param {string} p - 包名
 * @returns {string} 解析后的完整入口文件路径
 */
const resolveEntryForPkg = (/** @type {string} */ p) =>
  path.resolve(
    fileURLToPath(import.meta.url),
    `../../packages/${p}/src/index.ts`,
  )

// 读取 packages 目录下的所有子目录
const dirs = readdirSync(new URL('../packages', import.meta.url))

/**
 * 模块别名映射表
 * 包含了手动配置的特殊别名和自动生成的包别名
 *
 * @type {Record<string, string>}
 */
const entries = {
  // Vue.js 主包
  vue: resolveEntryForPkg('vue'),
  // 单文件组件编译器，使用特殊的导入路径
  'vue/compiler-sfc': resolveEntryForPkg('compiler-sfc'),
  // 服务端渲染器，使用特殊的导入路径
  'vue/server-renderer': resolveEntryForPkg('server-renderer'),
  // Vue 2 兼容层包
  '@vue/compat': resolveEntryForPkg('vue-compat'),
}

/**
 * 不包含标准 src 目录结构的包列表
 * 这些包通常是工具或示例项目，不需要创建别名
 */
const nonSrcPackages = ['sfc-playground', 'template-explorer', 'dts-test']

/**
 * 自动扫描 packages 目录，为所有有效的包创建别名
 * 过滤条件：
 * 1. 不是 'vue' 主包本身
 * 2. 不在非源码包列表中
 * 3. 尚未手动配置别名
 * 4. 是一个有效的目录
 */
for (const dir of dirs) {
  const key = `@vue/${dir}`
  if (
    dir !== 'vue' &&
    !nonSrcPackages.includes(dir) &&
    !(key in entries) &&
    statSync(new URL(`../packages/${dir}`, import.meta.url)).isDirectory()
  ) {
    entries[key] = resolveEntryForPkg(dir)
  }
}

export { entries }
